// function* foo(x) {
//   let y = 2 * (yield x + 1);
//   let z = yield y / 3;
//   return x + y + z;
// }

// let it = foo(5); // new Generator() // 迭代器
// console.log(it.next()); // { value: 6, done: false }
// console.log(it.next(12)); // { value: 8, done: false }
// console.log(it.next(13)); // { value: 42, done: true }
// // 1. 第一次调用next方法时，传入的参数会被忽略，因为第一次调用next方法时，yield表达式左边没有值，所以不会发生赋值操作，所以第一次调用next方法返回的是yield表达式的结果，即6
// // 2. 第二次调用next方法时，传入的参数12会被赋值给上一个yield表达式的左边，即y = 2 * 12 = 24，然后执行下一个yield表达式，即y / 3 = 24 / 3 = 8
// // 3. 第三次调用next方法时，传入的参数13会被赋值给上一个yield表达式的左边，即z = 13，然后执行return语句，即return x + y + z = 5 + 24 + 13 = 42

function ajax(url, callback) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      callback(url);
    }, Math.random() * 1000);
  });
}

function* fetch() {
  yield ajax('url', () => {}); // 模拟异步请求 1000ms
  yield ajax('url1', () => {}); // 模拟异步请求 500ms
  yield ajax('url2', () => {}); // 模拟异步请求 700ms
}

let its = fetch();
let res1 = its.next(); // { value: Promise { <pending> }, done: false }
res1.value.then(() => {
    let res2 = its.next(); 
    return res2.value
}).then(() => {
    let res3 = its.next();
    return res3.value
})

// let res2 = its.next();
// let res3 = its.next();
// 1. 第一次调用next方法时，执行ajax(URL, () => {})，模拟异步请求1000ms
// 2. 第二次调用next方法时，执行ajax(URL1, () => {})，模拟异步请求500ms
// 3. 第三次调用next方法时，执行ajax(URL2, () => {})，模拟异步请求700ms
